/**
* @Title: CommonConfig.java
* @Package com.b.conf
* @Description: TODO(用一句话描述该文件做什么)
* @author antch,861710865@qq.com
* @date 2017年7月4日 上午9:48:38
* @version V1.0
*/

package com.b.conf;

import org.beetl.core.GroupTemplate;
import org.beetl.ext.jfinal3.JFinal3BeetlRenderFactory;

import com.b.handler.HtmlHandler;
import com.b.interceptor.GobalIterceptor;
import com.b.model._MappingKit;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.render.ViewType;
import com.jfinal.template.Engine;

/**
 * @ClassName: CommonConfig
 * @Description: TODO(基于 JFinal 的 web 项目需要创建一个继承自 JFinalConfig 类的子类，该类用于对整个 web
 *               项目进行配置。)
 * @author antch,861710865@qq.com
 * @date 2017年7月4日 上午9:48:38
 *
 */

public class CommonConfig extends JFinalConfig {

	@Override
	public void configConstant(Constants me) {
		// TODO 此方法用来配置 JFinal 常量值，如开发模式常量 devMode 的配置
		/*
		 * 在开发模式下， JFinal 会对每次请求输出报告，如输出本次请求的 URL、 Controller、 Method以及请求所携带的参数。
		 */
		// 加载少量必要配置，随后可用PropKit.get(...)获取值
		PropKit.use("config.properties");
		// 设置开发者模式
		me.setDevMode(true);
		 me.setDevMode(PropKit.getBoolean("devMode", false));
		// 修改视图根目录，html不能放在WEB-INF/view中，因权限访问不到，但jsp可以
		// beetl.properties中不做设置，因为会与me.setBaseViewPath("WEB");设置冲突

		me.setError404View("404.html");
		me.setBaseDownloadPath("/download");
		me.setBaseUploadPath(PathKit.getWebRootPath() + "/upload");
		me.setUrlParaSeparator("-");

		/*
		 * me.setMainRenderFactory(new BeetlRenderFactory());
		// 获取GroupTemplate ,可以设置共享变量等操作
		GroupTemplate groupTemplate = BeetlRenderFactory.groupTemplate;
		groupTemplate.registerFunctionPackage("strutil", BeetlStrUtils.class);
		groupTemplate.registerFunctionPackage("flyfox", BeeltFunctions.class);
		 */
		// beetl模板配置工厂
		JFinal3BeetlRenderFactory beetlRenderFactory = new JFinal3BeetlRenderFactory();
		beetlRenderFactory.config();
		me.setRenderFactory(beetlRenderFactory);
//		me.set
		//  获取GroupTemplate ,可以设置共享变量等操作
		// src 下面加个beetl.properties文件就可以用了
		@SuppressWarnings("unused")
		GroupTemplate gt = beetlRenderFactory.groupTemplate;


		//设置视图类型
		me.setViewType(ViewType.JSP);
	}

	@Override
	public void configEngine(Engine arg0) {
		// TODO

	}

	@Override
	public void configHandler(Handlers handlers) {
		// TODO 配置Handler
		/*
		 * Handler 可以接管所有 web 请求，并对应用拥有完全的控制权， 可以很方便地实现更高层的功能性扩 展。
		 */
		handlers.add(new HtmlHandler());

	}

	@Override
	public void configInterceptor(Interceptors interceptors) {
		// TODO 添加全局拦截器
		/*
		 * 此方法用来配置 JFinal 的全局拦截器，全局拦截器将拦截所有 action 请求，除非使用
		 *
		 * @Clear 在 Controller 中清除。 JFinal 的 Interceptor 非常类似于 Struts2，但使用起来更方便，
		 * Interceptor 配置粒度分为 Global、 Inject、 Class、 Method 四个层次，其中下面代码配置粒度为全局。
		 */
		interceptors.add(new GobalIterceptor());

	}

	@Override
	public void configPlugin(Plugins plugins) {
		// TODO 配置插件
		/*
		 * JFinal 插件架构是其主要扩展方式之一， 可以方便地创建插件并应用到项目中去。
		 */
		// 配置C3p0数据库连接池插件
		C3p0Plugin c3p0Plugin = createC3p0Plugin();
		plugins.add(c3p0Plugin);

		// 在应用中使用 ActiveRecord 非常方便地操作数据库
		ActiveRecordPlugin recordPlugin = new ActiveRecordPlugin(c3p0Plugin);
		plugins.add(recordPlugin);
		// 所有配置在 MappingKit 中搞定
		_MappingKit.mapping(recordPlugin);

	}

	@Override
	public void configRoute(Routes me) {
		// 此方法用来配置 JFinal 访问路由
		/*
		 * Routes.setBaseViewPath(baseViewPath)方法用于为该 Routes 内部的所有 Controller 设置视
		 * 图渲染时的基础路径，该基础路径与 Rutes.add(…, viewType)方法传入的 viewPath 以及
		 * Controller.render(view) 方法传入的 view 参数联合组成最终的视图路径， 规则如下： finalView =
		 * baseViewPath + viewPath + view 注意：当 view 以 “/” 字符打头时表示绝对路径， baseViewPath 与
		 * viewPath 将被忽略。
		 */
		me.add("/blog", com.b.controller.BlogController.class);
		me.add("/front", com.b.controller.IndexController.class);
	}

	public static C3p0Plugin createC3p0Plugin() {
		return new C3p0Plugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());

	}

	@Override
	public void afterJFinalStart() {
		// TODO Auto-generated method stub
		super.afterJFinalStart();
		System.out.println("JFinal Start! Staring my thread.");

	}

	@Override
	public void beforeJFinalStop() {
		super.beforeJFinalStop();
		System.out.println("JFinal Stop! Stoping my thread.");
	}


	public static void main(String[] args) {
		/*PropKit.use("config.properties");
		System.out.println("配置文件读取");
		System.out.println("jdbcUrl" + PropKit.get("jdbcUrl"));*/
		JFinal.start("src/main/webapp", 80, "/", 5);
	}

}
